﻿using System;
using Microsoft.Office.Interop.Outlook;


namespace OutlookMessageWrapper
{
    /// <summary>
    /// Base class for outlook message item
    /// </summary>
    public abstract class OutlookMessageItemWrapper : IDisposable
    {
        /// <summary>
        /// Flag variable which tracks whether Dispose has been called.
        /// </summary>
        bool isDisposed = false;

        #region Following MUST be implemented into the drive class
        /// <summary>
        ///     Returns or sets a String (string in C#) indicating the subject for the Outlook
        ///     item. Read/write.
        ///</summary>
        public abstract string Subject { get; set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the unique Entry ID of the object.
        ///     Read-only.
        ///</summary>
        public abstract string EntryID { get; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the message class for
        ///     the Outlook item. Read/write.
        ///</summary>
        public abstract string MessageClass { get; set; }

        /// <summary>
        ///     Returns a String (string in C#) indicating the major and minor version number
        ///     of the Outlook application for an Outlook item. Read-only.
        ///</summary>
        public abstract string OutlookVersion { get; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the clear-text body
        ///     of the Outlook item. Read/write.
        ///</summary>
        public abstract string Body { get; set; }

        /// <summary>
        ///     Returns an Integer (int in C#) value indicating the size (in bytes) of the
        ///     Outlook item. Read-only.
        ///</summary>
        public abstract int Size { get; }

        /// <summary>
        ///     Returns a DateTime indicating the creation time for the Outlook item. Read-only.
        ///</summary>
        public abstract DateTime CreationTime { get; }

        /// <summary>
        ///     Returns a DateTime specifying the date and time that the Outlook item was
        ///     last modified. Read-only.
        ///</summary>
        public abstract DateTime LastModificationTime { get; }

        /// <summary>
        ///     Returns an Microsoft.Office.Interop.Outlook.Application object that represents
        ///     the parent Outlook application for the object. Read-only.
        ///</summary>
        public abstract Application Application { get; }

        #endregion
        
        #region Outlook mail item events

        /// <summary>
        ///     Occurs after Microsoft Outlook has saved the item.
        /// </summary>
        public virtual event ItemEvents_10_AfterWriteEventHandler AfterWrite = delegate { };

        /// <summary>
        ///     Occurs when an attachment has been added to an instance of the parent object.
        ///     </summary>
        public virtual event ItemEvents_10_AttachmentAddEventHandler AttachmentAdd = delegate { };

        /// <summary>
        ///     Occurs when an attachment in an instance of the parent object has been opened
        ///     for reading.
        /// </summary>
        public virtual event ItemEvents_10_AttachmentReadEventHandler AttachmentRead = delegate { };

        /// <summary>
        ///     Occurs when an attachment has been removed from an instance of the parent
        ///     object.
        /// </summary>
        public virtual event ItemEvents_10_AttachmentRemoveEventHandler AttachmentRemove = delegate { };

        /// <summary>
        ///     Occurs before an attachment is added to an instance of the parent object.
        ///     </summary>
        public virtual event ItemEvents_10_BeforeAttachmentAddEventHandler BeforeAttachmentAdd = delegate { };

        /// <summary>
        ///     Occurs before an attachment associated with an instance of the parent object
        ///     is previewed.
        ///     </summary>
        public virtual event ItemEvents_10_BeforeAttachmentPreviewEventHandler BeforeAttachmentPreview = delegate { };

        /// <summary>
        ///     Occurs before an attachment associated with an instance of the parent object
        ///     is read from the file system, an attachment stream, or an Microsoft.Office.Interop.Outlook.Attachment
        ///     object.
        ///     </summary>
        public virtual event ItemEvents_10_BeforeAttachmentReadEventHandler BeforeAttachmentRead = delegate { };

        /// <summary>
        ///     Occurs just before an attachment is saved.
        ///     </summary>        
        public virtual event ItemEvents_10_BeforeAttachmentSaveEventHandler BeforeAttachmentSave = delegate { };

        /// <summary>
        ///     Occurs before an attachment associated with an instance of the parent object
        ///     is written to a temporary file.
        ///  </summary>
        public virtual event ItemEvents_10_BeforeAttachmentWriteToTempFileEventHandler BeforeAttachmentWriteToTempFile = delegate { };

        /// <summary>
        ///     Occurs before the item is automatically saved by Outlook.
        /// </summary>
        public virtual event ItemEvents_10_BeforeAutoSaveEventHandler BeforeAutoSave = delegate { };

        /// <summary>
        ///     Occurs just before Microsoft Outlook starts resolving names in the recipient
        ///     collection for an item (which is an instance of the parent object).
        ///     </summary>
        public virtual event ItemEvents_10_BeforeCheckNamesEventHandler BeforeCheckNames = delegate { };

        /// <summary>
        ///     Occurs before an item (which is an instance of the parent object) is deleted.
        ///     </summary>
        public virtual event ItemEvents_10_BeforeDeleteEventHandler BeforeDelete = delegate { };

        /// <summary>
        ///     Occurs before Microsoft Outlook begins to read the properties for the item.
        ///     </summary>
        public virtual event ItemEvents_10_BeforeReadEventHandler BeforeRead = delegate { };

        /// <summary>
        ///     Occurs when the inspector associated with an item (which is an instance of
        ///     the parent object) is being closed.
        ///     </summary>
        public virtual event ItemEvents_10_CloseEventHandler CloseItem = delegate { };

        /// <summary>
        ///     Occurs when a custom action of an item (which is an instance of the parent
        ///     object) executes.
        ///     </summary>
        public virtual event ItemEvents_10_CustomActionEventHandler CustomAction = delegate { };

        /// <summary>
        ///     Occurs when a custom property of an item (which is an instance of the parent
        ///     object) is changed.
        ///     </summary>
        public virtual event ItemEvents_10_CustomPropertyChangeEventHandler CustomPropertyChange= delegate { };

        /// <summary>
        ///     Occurs when the user selects the Forward action for an item (which is an
        ///     instance of the parent object).
        ///     </summary>
        public virtual event ItemEvents_10_ForwardEventHandler ForwardItem= delegate { };

        /// <summary>
        ///     Occurs when an instance of the parent object is being opened in an Microsoft.Office.Interop.Outlook.Inspector.
        ///     </summary>
        public virtual event ItemEvents_10_OpenEventHandler Open= delegate { };

        /// <summary>
        ///     Occurs when an explicit built-in property of an instance of the parent object
        ///     is changed.
        ///     </summary>
        public virtual event ItemEvents_10_PropertyChangeEventHandler PropertyChange= delegate { };

        /// <summary>
        ///     Occurs when an instance of the parent object is opened for editing by the
        ///     user.
        ///     </summary>
        public virtual event ItemEvents_10_ReadEventHandler Read= delegate { };

        /// <summary>
        ///     Occurs when the user selects the Reply action for an item (which is an instance
        ///     of the parent object).
        public virtual event ItemEvents_10_ReplyEventHandler ReplyItem= delegate { };

        /// <summary>
        ///     Occurs when the user selects the ReplyAll action for an item (which is an
        ///     instance of the parent object).
        ///     </summary>
        public virtual event ItemEvents_10_ReplyAllEventHandler ReplyAllItem= delegate { };

        /// <summary>
        ///     Occurs when the user selects the Send action for an item (which is an instance
        ///     of the parent object).
        ///     </summary>
        public virtual event ItemEvents_10_SendEventHandler SendItem= delegate { };

        /// <summary>
        ///     Occurs before an Outlook item is unloaded from memory, either programmatically
        ///     or by user action.
        ///     </summary>
        public virtual event ItemEvents_10_UnloadEventHandler Unload= delegate { };

        /// <summary>
        ///     Occurs when an instance of the parent object is saved, either explicitly
        ///     or implicitly (for example, in response to a prompt when closing the item's
        ///     inspector).
        ///     </summary>
        public virtual event ItemEvents_10_WriteEventHandler Write= delegate { };

        #endregion
        
        #region Following can be overridden in the drive class

        /// <summary>
        ///     Returns an Microsoft.Office.Interop.Outlook.Actions collection that represents
        ///     all the available actions for the item. Read-only.
        ///</summary>
        public virtual Actions Actions { get; private set; }

        /// <summary>
        ///     Returns a Boolean (bool in C#) that is True if the mail message can be forwarded.
        ///     Read/write.
        ///</summary>
        public virtual bool AlternateRecipientAllowed { get; set; }

        /// <summary>
        ///     Returns an Microsoft.Office.Interop.Outlook.Attachments object that represents
        ///     all the attachments for the specified item. Read-only.
        ///</summary>
        public virtual Attachments Attachments { get; private set; }

        /// <summary>
        ///     A Boolean (bool in C#) value that returns True if the item was automatically
        ///     forwarded. Read/write.
        ///</summary>
        public virtual bool AutoForwarded { get; set; }

        /// <summary>
        ///     Returns a Boolean (bool in C#) that determines if the item is a winner of
        ///     an automatic conflict resolution. Read-only.
        ///</summary>
        public virtual bool AutoResolvedWinner { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the display list of blind carbon
        ///     copy (BCC) names for a Microsoft.Office.Interop.Outlook.MailItem. Read/write.
        ///</summary>
        public virtual string BCC { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the billing information
        ///     associated with the Outlook item. Read/write.
        ///</summary>
        public virtual string BillingInformation { get; set; }

        /// <summary>
        ///     Returns or sets an Microsoft.Office.Interop.Outlook.OlBodyFormat constant
        ///     indicating the format of the body text. Read/write.
        ///</summary>
        public virtual OlBodyFormat BodyFormat { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the categories assigned
        ///     to the Outlook item. Read/write.
        ///</summary>
        public virtual string Categories { get; set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the display list of carbon copy
        ///     (CC) names for a Microsoft.Office.Interop.Outlook.MailItem. Read/write.
        ///</summary>
        public virtual string CC { get; set; }

        /// <summary>
        ///     Returns an Microsoft.Office.Interop.Outlook.OlObjectClass constant indicating
        ///     the object's class. Read-only.
        ///</summary>
        public virtual OlObjectClass Class { get; private set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the names of the companies
        ///     associated with the Outlook item. Read/write.
        ///</summary>
        public virtual string Companies { get; set; }

        /// <summary>
        ///     Return the Microsoft.Office.Interop.Outlook.Conflicts object that represents
        ///     the items that are in conflict for any Outlook item object. Read-only.
        ///</summary>
        public virtual Conflicts Conflicts { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) that uniquely identifies a Microsoft.Office.Interop.Outlook.Conversation
        ///     object that the Microsoft.Office.Interop.Outlook.MailItem object belongs
        ///     to. Read-only.
        ///</summary>
        public virtual string ConversationID { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the index of the conversation
        ///     thread of the Outlook item. Read-only.
        ///</summary>
        public virtual string ConversationIndex { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the topic of the conversation
        ///     thread of the Outlook item. Read-only.
        ///</summary>
        public virtual string ConversationTopic { get; private set; }

        /// <summary>
        ///     Returns or sets a DateTime indicating the date and time the mail message
        ///     is to be delivered. Read/write.
        ///</summary>
        public virtual DateTime DeferredDeliveryTime { get; set; }

        /// <summary>
        ///     Returns or sets a Boolean (bool in C#) value that is True if a copy of the
        ///     mail message is not saved upon being sent, and False if a copy is saved.
        ///     Read/write.
        ///</summary>
        public virtual bool DeleteAfterSubmit { get; set; }

        /// <summary>
        ///     Returns a constant that belongs to the Microsoft.Office.Interop.Outlook.OlDownloadState
        ///     enumeration indicating the download state of the item. Read-only.
        ///</summary>
        public virtual OlDownloadState DownloadState { get; private set; }

        /// <summary>
        ///     This object, member, or enumeration is deprecated and is not intended to
        ///     be used in your code.
        ///</summary>
        public virtual bool EnableSharedAttachments { get; set; }

        /// <summary>
        ///     Returns or sets a DateTime indicating the date and time at which the item
        ///     becomes invalid and can be deleted. Read/write.
        ///</summary>
        public virtual DateTime ExpiryTime { get; set; }

        /// <summary>
        ///     This object, member, or enumeration is deprecated and is not intended to
        ///     be used in your code.
        ///</summary>
        public virtual DateTime FlagDueBy { get; set; }

        /// <summary>
        ///     This object, member, or enumeration is deprecated and is not intended to
        ///     be used in your code.
        ///</summary>
        public virtual OlFlagIcon FlagIcon { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) that indicates the requested action
        ///     for a mail item. Read/write.
        ///</summary>
        public virtual string FlagRequest { get; set; }

        /// <summary>
        ///     This object, member, or enumeration is deprecated and is not intended to
        ///     be used in your code.
        ///</summary>
        public virtual OlFlagStatus FlagStatus { get; set; }

        /// <summary>
        ///     Returns the Microsoft.Office.Interop.Outlook.FormDescription object that
        ///     represents the form description for the specified Outlook item. Read-only.
        ///</summary>
        public virtual FormDescription FormDescription { get; private set; }

        /// <summary>
        ///     Returns an Microsoft.Office.Interop.Outlook.Inspector object that represents
        ///     an inspector initialized to contain the specified item. Read-only.
        ///</summary>
        public virtual Inspector GetInspector { get; private set; }

        /// <summary>
        ///     This object, member, or enumeration is deprecated and is not intended to
        ///     be used in your code.
        ///</summary>
        public virtual bool HasCoverSheet { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the HTML body of the
        ///     specified item. Read/write.
        ///</summary>
        public virtual string HTMLBody { get; set; }

        /// <summary>
        ///     Returns or sets an Microsoft.Office.Interop.Outlook.OlImportance constant
        ///     indicating the relative importance level for the Outlook item. Read/write.
        ///</summary>
        public virtual OlImportance Importance { get; set; }

        /// <summary>
        ///     Returns or sets an Integer (int in C#) value that determines the Internet
        ///     code page used by the item. Read/write.
        ///</summary>
        public virtual int InternetCodepage { get; set; }

        /// <summary>
        ///     Returns a Boolean (bool in C#) that determines if the item is in conflict.
        ///     Read-only.
        ///</summary>
        public virtual bool IsConflict { get; private set; }

        /// <summary>
        ///     This object, member, or enumeration is deprecated and is not intended to
        ///     be used in your code.
        ///</summary>
        public virtual bool IsIPFax { get; set; }

        /// <summary>
        ///     Returns a Boolean (bool in C#) value that indicates whether the Microsoft.Office.Interop.Outlook.MailItem
        ///     is marked as a task. Read-only.
        ///</summary>
        public virtual bool IsMarkedAsTask { get; private set; }

        /// <summary>
        ///     Returns an Microsoft.Office.Interop.Outlook.ItemProperties collection that
        ///     represents all standard and user-defined properties associated with the Outlook
        ///     item. Read-only.
        ///</summary>
        public virtual ItemProperties ItemProperties { get; private set; }

        /// <summary>
        ///     Returns a Microsoft.Office.Interop.Outlook.Links collection that represents
        ///     the contacts to which the item is linked. Read-only.
        ///</summary>
        public virtual Links Links { get; private set; }

        /// <summary>
        ///     This object, member, or enumeration is deprecated and is not intended to
        ///     be used in your code.
        ///</summary>
        public virtual dynamic MAPIOBJECT { get; private set; }

        /// <summary>
        ///     Returns or sets an Microsoft.Office.Interop.Outlook.OlRemoteStatus constant
        ///     that determines the status of an item once it is received by a remote user.
        ///     Read/write.
        ///</summary>
        public virtual OlRemoteStatus MarkForDownload { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the mileage for an item.
        ///     Read/write.
        ///</summary>
        public virtual string Mileage { get; set; }

        /// <summary>
        ///     Returns or sets a Boolean (bool in C#) value that is True to not age the
        ///     Outlook item. Read/write.
        ///</summary>
        public virtual bool NoAging { get; set; }

        /// <summary>
        ///     Returns or sets a Boolean (bool in C#) value that determines whether the
        ///     originator of the meeting item or mail message will receive a delivery report.
        ///     Read/write.
        ///</summary>
        public virtual bool OriginatorDeliveryReportRequested { get; set; }

        /// <summary>
        ///     Returns an Integer (int in C#) value representing the build number of the
        ///     Outlook application for an Outlook item. Read-only.
        ///</summary>
        public virtual int OutlookInternalVersion { get; private set; }

        /// <summary>
        ///     Returns the parent Object of the specified object. Read-only.
        ///</summary>
        public virtual dynamic Parent { get; private set; }

        /// <summary>
        ///     Sets or returns an Microsoft.Office.Interop.Outlook.OlPermission constant
        ///     that determines the permissions the recipients will have on the e-mail item.
        ///     Read/write.
        ///</summary>
        public virtual OlPermission Permission { get; set; }

        /// <summary>
        ///     Sets or returns an Microsoft.Office.Interop.Outlook.OlPermissionService constant
        ///     that determines the permission service that will be used when sending a message
        ///     protected by Information Rights Management (IRM). Read/write.
        ///</summary>
        public virtual OlPermissionService PermissionService { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) value that represents the GUID of
        ///     the template file to apply to the Microsoft.Office.Interop.Outlook.MailItem
        ///     in order to specify Information Rights Management (IRM) permissions. Read/write.
        ///</summary>
        public virtual string PermissionTemplateGuid { get; set; }

        /// <summary>
        ///     Returns a Microsoft.Office.Interop.Outlook.PropertyAccessor object that supports
        ///     creating, getting, setting, and deleting properties of the parent Microsoft.Office.Interop.Outlook.MailItem
        ///     object. Read-only.
        ///</summary>
        public virtual PropertyAccessor PropertyAccessor { get; private set; }

        /// <summary>
        ///     Returns a Boolean (bool in C#) value that indicates True if a read receipt
        ///     has been requested by the sender.
        ///</summary>
        public virtual bool ReadReceiptRequested { get; set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the Microsoft.Office.Interop.Outlook.Recipient.EntryID
        ///     for the true recipient as set by the transport provider delivering the mail
        ///     message. Read-only.
        ///</summary>
        public virtual string ReceivedByEntryID { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the display name of the true
        ///     recipient for the mail message. Read-only.
        ///</summary>
        public virtual string ReceivedByName { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the Microsoft.Office.Interop.Outlook.Recipient.EntryID
        ///     of the user delegated to represent the recipient for the mail message. Read-only.
        ///</summary>
        public virtual string ReceivedOnBehalfOfEntryID { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the display name of the user
        ///     delegated to represent the recipient for the mail message. Read-only.
        ///</summary>
        public virtual string ReceivedOnBehalfOfName { get; private set; }

        /// <summary>
        ///     Returns a DateTime indicating the date and time at which the item was received.
        ///     Read-only.
        ///</summary>
        public virtual DateTime ReceivedTime { get; private set; }

        /// <summary>
        ///     Returns a Boolean (bool in C#) that indicates True if the recipient cannot
        ///     forward the mail message. Read/write.
        ///</summary>
        public virtual bool RecipientReassignmentProhibited { get; set; }

        /// <summary>
        ///     Returns a Microsoft.Office.Interop.Outlook.Recipients collection that represents
        ///     all the recipients for the Outlook item. Read-only.
        ///</summary>
        public virtual Recipients Recipients { get; private set; }

        /// <summary>
        ///     Returns or sets a Boolean (bool in C#) value that is True if the reminder
        ///     overrides the default reminder behavior for the item. Read/write.
        ///</summary>
        public virtual bool ReminderOverrideDefault { get; set; }

        /// <summary>
        ///     Returns or sets a Boolean (bool in C#) value that is True if the reminder
        ///     should play a sound when it occurs for this item. Read/write.
        ///</summary>
        public virtual bool ReminderPlaySound { get; set; }

        /// <summary>
        ///     Returns or sets a Boolean (bool in C#) value that is True if a reminder has
        ///     been set for this item. Read/write.
        ///</summary>
        public virtual bool ReminderSet { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) indicating the path and file name
        ///     of the sound file to play when the reminder occurs for the Outlook item.
        ///     Read/write.
        ///</summary>
        public virtual string ReminderSoundFile { get; set; }

        /// <summary>
        ///     Returns or sets a DateTime indicating the date and time at which the reminder
        ///     should occur for the specified item. Read/write.
        ///</summary>
        public virtual DateTime ReminderTime { get; set; }

        /// <summary>
        ///     Returns or sets an Microsoft.Office.Interop.Outlook.OlRemoteStatus constant
        ///     specifying the remote status of the mail message. Read/write.
        ///</summary>
        public virtual OlRemoteStatus RemoteStatus { get; set; }

        /// <summary>
        ///     Returns a semicolon-delimited String (string in C#) list of reply recipients
        ///     for the mail message. Read-only.
        ///</summary>
        public virtual string ReplyRecipientNames { get; private set; }

        /// <summary>
        ///     Returns a Microsoft.Office.Interop.Outlook.Recipients collection that represents
        ///     all the reply recipient objects for the Outlook item. Read-only.
        ///</summary>
        public virtual Recipients ReplyRecipients { get; private set; }
        /// <summary>
        ///     Returns a System.DateTime value that specifies the date when the Microsoft.Office.Interop.Outlook.MailItem
        ///     object expires, after which the Messaging Records Management (MRM) Assistant
        ///     will delete the item. Read-only.
        ///</summary>
        public virtual DateTime RetentionExpirationDate { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) that specifies the name of the retention
        ///     policy. Read-only.
        ///</summary>
        public virtual string RetentionPolicyName { get; private set; }

        /// <summary>
        ///     Returns or sets a byte array that represents the body of the Microsoft Outlook
        ///     item in Rich Text Format. Read/write.
        ///</summary>
        public virtual dynamic RTFBody { get; set; }

        /// <summary>
        ///     Returns a Boolean (bool in C#) value that is True if the Outlook item has
        ///     not been modified since the last save. Read-only.
        ///</summary>
        public virtual bool Saved { get; private set; }

        /// <summary>
        ///     Returns or sets a Microsoft.Office.Interop.Outlook.Folder object that represents
        ///     the folder in which a copy of the e-mail message will be saved after being
        ///     sent. Read/write.
        ///</summary>
        public virtual MAPIFolder SaveSentMessageFolder { get; set; }

        /// <summary>
        ///     Returns or sets an Microsoft.Office.Interop.Outlook.AddressEntry object that
        ///     corresponds to the user of the account from which the Microsoft.Office.Interop.Outlook.MailItem
        ///     is sent. Read/write.
        ///</summary>
        public virtual AddressEntry Sender { get; set; }

        /// <summary>
        ///     Returns a String (string in C#) that represents the e-mail address of the
        ///     sender of the Outlook item. Read-only.
        ///</summary>
        public virtual string SenderEmailAddress { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) that represents the type of entry for the
        ///     e-mail address of the sender of the Outlook item, such as 'SMTP' for Internet
        ///     address, 'EX' for a Microsoft Exchange server address, etc. Read-only.
        ///</summary>
        public virtual string SenderEmailType { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) indicating the display name of the sender
        ///     for the Outlook item. Read-only.
        ///</summary>
        public virtual string SenderName { get; private set; }

        /// <summary>
        ///     Returns or sets an Microsoft.Office.Interop.Outlook.Account object that represents
        ///     the account under which the Microsoft.Office.Interop.Outlook.MailItem is
        ///     to be sent. Read/write.
        ///</summary>
        public virtual Account SendUsingAccount { get; set; }

        /// <summary>
        ///     Returns or sets a constant in the Microsoft.Office.Interop.Outlook.OlSensitivity
        ///     enumeration indicating the sensitivity for the Outlook item. Read/write.
        ///</summary>
        public virtual OlSensitivity Sensitivity { get; set; }

        /// <summary>
        ///     Returns a Boolean (bool in C#) value that indicates if a message has been
        ///     sent. Read-only.
        ///</summary>
        public virtual bool Sent { get; private set; }

        /// <summary>
        ///     Returns a DateTime indicating the date and time on which the Outlook item
        ///     was sent. Read-only.
        ///</summary>
        public virtual DateTime SentOn { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) indicating the display name for the intended
        ///     sender of the mail message. Read/write.
        ///</summary>
        public virtual string SentOnBehalfOfName { get; set; }

        /// <summary>
        ///     Returns the Microsoft.Office.Interop.Outlook.NameSpace object for the current
        ///     session. Read-only.
        ///</summary>
        public virtual NameSpace Session { get; private set; }

        /// <summary>
        ///     Returns a Boolean (bool in C#) value that is True if the item has been submitted.
        ///     Read-only.
        ///</summary>
        public virtual bool Submitted { get; private set; }

        /// <summary>
        ///     Returns or sets a DateTime value that represents the completion date of the
        ///     task for this Microsoft.Office.Interop.Outlook.MailItem. Read/write.
        ///</summary>
        public virtual DateTime TaskCompletedDate { get; set; }

        /// <summary>
        ///     Returns or sets a DateTime value that represents the due date of the task
        ///     for this Microsoft.Office.Interop.Outlook.MailItem. Read/write.
        ///</summary>
        public virtual DateTime TaskDueDate { get; set; }

        /// <summary>
        ///     Returns or sets a DateTime value that represents the start date of the task
        ///     for this Microsoft.Office.Interop.Outlook.MailItem object. Read/write.
        ///</summary>
        public virtual DateTime TaskStartDate { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) value that represents the subject
        ///     of the task for the Microsoft.Office.Interop.Outlook.MailItem object. Read/write.
        ///</summary>
        public virtual string TaskSubject { get; set; }

        /// <summary>
        ///     Returns or sets a semicolon-delimited String (string in C#) list of display
        ///     names for the To recipients for the Outlook item. Read/write.
        ///</summary>
        public virtual string To { get; set; }

        /// <summary>
        ///     Returns or sets a DateTime value that represents the ordinal value of the
        ///     task for the Microsoft.Office.Interop.Outlook.MailItem. Read/write.
        ///</summary>
        public virtual DateTime ToDoTaskOrdinal { get; set; }

        /// <summary>
        ///     Returns or sets a Boolean (bool in C#) value that is True if the Outlook
        ///     item has not been opened (read). Read/write.
        ///</summary>
        public virtual bool UnRead { get; set; }

        /// <summary>
        ///     Returns the Microsoft.Office.Interop.Outlook.UserProperties collection that
        ///     represents all the user properties for the Outlook item. Read-only.
        ///</summary>
        public virtual UserProperties UserProperties { get; private set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) specifying a delimited string containing
        ///     the voting options for the mail message. Read/write.
        ///</summary>
        public virtual string VotingOptions { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) specifying the voting response for
        ///     the mail message. Read/write.
        ///</summary>
        public virtual string VotingResponse { get; set; }

        /// <summary>
        ///     Appends contact information based on the Electronic Business Card (EBC) associated
        ///     with the specified Microsoft.Office.Interop.Outlook.ContactItem object to
        ///     the Microsoft.Office.Interop.Outlook.MailItem object.
        /// Parameters:
        ///   contact:
        ///     The contact item from which to obtain the business card information.
        ///</summary>
        public virtual void AddBusinessCard(ContactItem contact) { }

        /// <summary>
        ///     Clears the index of the conversation thread for the mail message.
        ///</summary>
        public virtual void ClearConversationIndex() { }

        /// <summary>
        ///     Clears the Microsoft.Office.Interop.Outlook.MailItem object as a task.
        ///</summary>
        public virtual void ClearTaskFlag() { }

        /// <summary>
        ///     Closes and optionally saves changes to the Outlook item.
        /// Parameters:
        ///   SaveMode:
        ///     The close behavior. If the item displayed within the inspector has not been
        ///     changed, this argument has no effect.
        ///</summary>
        public virtual void Close(OlInspectorClose SaveMode) { }

        /// <summary>
        ///     Creates another instance of an object.
        /// Returns:
        ///     Returns an System.Object that is a copy of the parent Microsoft.Office.Interop.Outlook.MailItem
        ///     object.
        ///</summary>
        public virtual dynamic Copy() { return null; }

        /// <summary>
        ///     Deletes an object from the collection.
        ///</summary>
        public virtual void Delete() { }

        /// <summary>
        ///     Displays a new Microsoft.Office.Interop.Outlook.Inspector object for the
        ///     item.
        /// Parameters:
        ///   Modal:
        ///     True to make the window modal. The default value is False.
        ///</summary>
        public virtual void Display(object Modal = null) { }

        /// <summary>
        ///     Executes the Forward action for an item and returns the resulting copy as
        ///     a Microsoft.Office.Interop.Outlook.MailItem object.
        /// Returns:
        ///     A MailItem object that represents the new mail item.
        ///</summary>
        public virtual OutlookMessageItemWrapper Forward() { return null; }

        /// <summary>
        ///     Obtains a Microsoft.Office.Interop.Outlook.Conversation object that represents
        ///     the conversation to which this item belongs.
        /// Returns:
        ///     Returns a Conversation object that represents the conversation to which this
        ///     item belongs.
        ///</summary>
        public virtual Conversation GetConversation() { return null; }

        /// <summary>
        ///     Marks a Microsoft.Office.Interop.Outlook.MailItem object as a task and assigns
        ///     a task interval for the object.
        /// Parameters:
        ///   MarkInterval:
        ///     The task interval for the MailItem.
        ///</summary>
        public virtual void MarkAsTask(OlMarkInterval MarkInterval) { }

        /// <summary>
        ///     Moves a Microsoft Outlook item to a new folder.
        /// Parameters:
        ///   DestFldr:
        ///     An expression that returns a Folder object. The destination folder.
        /// Returns:
        ///     An Object value that represents the item which has been moved to the designated
        ///     folder.
        ///</summary>
        public virtual dynamic Move(MAPIFolder DestFldr) { return null; }

        /// <summary>
        ///     Prints the Outlook item using all default settings. The PrintOut method is
        ///     the only Outlook method that can be used for printing.
        ///</summary>
        public virtual void PrintOut() { }

        /// <summary>
        ///     Creates a reply, pre-addressed to the original sender, from the original
        ///     message.
        /// Returns:
        ///     A Microsoft.Office.Interop.Outlook.MailItem object that represents the reply.
        ///</summary>
        public virtual OutlookMessageItemWrapper Reply() { return null; }

        /// <summary>
        ///     Creates a reply to all original recipients from the original message.
        /// Returns:
        ///     A Microsoft.Office.Interop.Outlook.MailItem object that represents the reply.
        ///</summary>
        public virtual OutlookMessageItemWrapper ReplyAll() { return null; }

        /// <summary>
        ///     Saves the Microsoft Outlook item to the current folder or, if this is a new
        ///     item, to the Outlook default folder for the item type.
        ///</summary>
        public virtual void Save() { }

        /// <summary>
        ///     Saves the Microsoft Outlook item to the specified path and in the format
        ///     of the specified file type. If the file type is not specified, the MSG format
        ///     (.msg) is used.
        /// Parameters:
        ///   Path:
        ///     The path in which to save the item.
        ///   Type:
        ///     The file type to save. Can be one of the following OlSaveAsType constants:
        ///     olHTML, olMSG, olRTF, olTemplate, olDoc,olTXT, olVCal, olVCard, olICal, or
        ///     olMSGUnicode.
        ///</summary>
        public virtual void SaveAs(string Path, object Type = null) { }

        /// <summary>
        ///     Sends the e-mail message.
        ///</summary>
        public virtual void Send() { }

        /// <summary>
        ///     Displays the Show Categories dialog box, which allows you to select categories
        ///     that correspond to the subject of the item.
        ///</summary>
        public virtual void ShowCategoriesDialog() { }

        #endregion

        #region Specific to Appointment

        /// <summary>
        ///    Returns True if the appointment is an all-day event (as opposed to a specified
        ///    time). Read/write.
        ///</summary>
        public virtual bool AllDayEvent { get; set; }

        /// <summary>
        ///    Returns or sets an Microsoft.Office.Interop.Outlook.OlBusyStatus constant
        ///    indicating the busy status of the user for the appointment. Read/write.
        /// <\summary>
        public virtual OlBusyStatus BusyStatus { get; set; }

        /// <summary>
        ///    This object, member, or enumeration is deprecated and is not intended to
        ///    be used in your code.
        /// <\summary>
        public virtual bool ConferenceServerAllowExternal { get; set; }

        /// <summary>
        ///    This object, member, or enumeration is deprecated and is not intended to
        ///    be used in your code.
        /// <\summary>
        public virtual string ConferenceServerPassword { get; set; }

        /// <summary>
        ///    Returns or sets an Integer (int in C#) value indicating the duration (in
        ///    minutes) of the Microsoft.Office.Interop.Outlook.AppointmentItem. Read/write.
        /// <\summary>
        public virtual int Duration { get; set; }

        /// <summary>
        ///    Returns or sets a DateTime indicating the end date and time of an Microsoft.Office.Interop.Outlook.AppointmentItem.
        ///    Read/write.
        /// <\summary>
        public virtual DateTime End { get; set; }

        /// <summary>
        ///    Returns or sets a DateTime value that represents the end date and time of
        ///    the appointment expressed in the Microsoft.Office.Interop.Outlook._AppointmentItem.EndTimeZone.
        ///    Read/write.
        /// <\summary>
        public virtual DateTime EndInEndTimeZone { get; set; }

        /// <summary>
        ///    Returns or sets a Microsoft.Office.Interop.Outlook.TimeZone value that corresponds
        ///    to the end time of the appointment. Read/write.
        /// <\summary>
        public virtual Microsoft.Office.Interop.Outlook.TimeZone EndTimeZone { get; set; }

        /// <summary>
        ///    Returns or sets a DateTime value that represents the end date and time of
        ///    the appointment expressed in the Coordinated Universal Time (UTC) standard.
        ///    Read/write.
        /// <\summary>
        public virtual DateTime EndUTC { get; set; }

        /// <summary>
        ///    Returns or sets a Boolean (bool in C#) value that indicates whether updates
        ///    to the Microsoft.Office.Interop.Outlook.AppointmentItem object should be
        ///    sent to all attendees. Read/write.
        /// <\summary>
        public virtual bool ForceUpdateToAllAttendees { get; set; }

        /// <summary>
        ///    Returns a String (string in C#) value that represents a unique global identifier
        ///    for the Microsoft.Office.Interop.Outlook.AppointmentItem object. Read-only.
        /// <\summary>
        public virtual string GlobalAppointmentID { get; private set; }

        /// <summary>
        ///    This object, member, or enumeration is deprecated and is not intended to
        ///    be used in your code.
        /// <\summary>
        public virtual bool IsOnlineMeeting { get; set; }

        /// <summary>
        ///    Returns a Boolean (bool in C#) value that is True if the appointment is a
        ///    recurring appointment. Read-only.
        /// <\summary>
        public virtual bool IsRecurring { get; private set; }

        /// <summary>
        ///    Returns or sets a String (string in C#) representing the specific office
        ///    location (for example, Building 1 Room 1 or Suite 123) for the appointment.
        ///    Read/write.
        /// <\summary>
        public virtual string Location { get; set; }

        /// <summary>
        ///    Returns or sets an Microsoft.Office.Interop.Outlook.OlMeetingStatus constant
        ///    specifying the meeting status of the appointment. Read/write.
        /// <\summary>
        public virtual OlMeetingStatus MeetingStatus { get; set; }

        /// <summary>
        ///    Returns a String (string in C#) value that represents the URL for the Meeting
        ///    Workspace that the appointment item is linked to. Read-only.
        /// <\summary>
        public virtual string MeetingWorkspaceURL { get; private set; }

        /// <summary>
        ///    This object, member, or enumeration is deprecated and is not intended to
        ///    be used in your code.
        /// <\summary>
        public virtual bool NetMeetingAutoStart { get; set; }

        /// <summary>
        ///    This object, member, or enumeration is deprecated and is not intended to
        ///    be used in your code.
        /// <\summary>
        public virtual string NetMeetingDocPathName { get; set; }

        /// <summary>
        ///    This object, member, or enumeration is deprecated and is not intended to
        ///    be used in your code.
        /// <\summary>
        public virtual string NetMeetingOrganizerAlias { get; set; }

        /// <summary>
        ///    This object, member, or enumeration is deprecated and is not intended to
        ///    be used in your code.
        /// <\summary>
        public virtual string NetMeetingServer { get; set; }

        /// <summary>
        ///    This object, member, or enumeration is deprecated and is not intended to
        ///    be used in your code.
        /// <\summary>
        public virtual OlNetMeetingType NetMeetingType { get; set; }

        /// <summary>
        ///    This object, member, or enumeration is deprecated and is not intended to
        ///    be used in your code.
        /// <\summary>
        public virtual string NetShowURL { get; set; }

        /// <summary>
        ///    Returns or sets a String (string in C#) representing the display string of
        ///    optional attendees names for the appointment. Read/write.
        /// <\summary>
        public virtual string OptionalAttendees { get; set; }

        /// <summary>
        ///    Returns a String (string in C#) representing the name of the organizer of
        ///    the appointment. Read-only.
        /// <\summary>
        public virtual string Organizer { get; private set; }

        /// <summary>
        ///    Returns an Microsoft.Office.Interop.Outlook.OlRecurrenceState constant indicating
        ///    the recurrence property of the specified object. Read-only.
        /// <\summary>
        public virtual OlRecurrenceState RecurrenceState { get; private set; }

        /// <summary>
        ///    Returns or sets an Integer (int in C#) value indicating the number of minutes
        ///    the reminder should occur prior to the start of the appointment. Read/write.
        /// <\summary>
        public virtual int ReminderMinutesBeforeStart { get; set; }

        /// <summary>
        ///    Returns or sets a DateTime indicating the reply time for the appointment.
        ///    Read/write.
        /// <\summary>
        public virtual DateTime ReplyTime { get; set; }

        /// <summary>
        ///    Returns a semicolon-delimited String (string in C#) of required attendee
        ///    names for the meeting appointment. Read/write.
        /// <\summary>
        public virtual string RequiredAttendees { get; set; }

        /// <summary>
        ///    Returns a semicolon-delimited String (string in C#) of resource names for
        ///    the meeting. Read/write.
        /// <\summary>
        public virtual string Resources { get; set; }

        /// <summary>
        ///    Returns a Boolean (bool in C#) that indicates True if the sender would like
        ///    a response to the meeting request for the appointment. Read/write.
        /// <\summary>
        public virtual bool ResponseRequested { get; set; }

        /// <summary>
        ///    Returns an Microsoft.Office.Interop.Outlook.OlResponseStatus constant indicating
        ///    the overall status of the meeting for the current user for the appointment.
        ///    Read-only.
        /// <\summary>
        public virtual OlResponseStatus ResponseStatus { get; private set; }

        /// <summary>
        ///    Returns or sets a DateTime indicating the starting date and time for the
        ///    Outlook item. Read/write.
        /// <\summary>
        public virtual DateTime Start { get; set; }

        /// <summary>
        ///    Returns or sets a DateTime value that represents the start date and time
        ///    of the appointment expressed in the Microsoft.Office.Interop.Outlook._AppointmentItem.StartTimeZone.
        ///    Read/write.
        /// <\summary>
        public virtual DateTime StartInStartTimeZone { get; set; }

        /// <summary>
        ///    Returns or sets a Microsoft.Office.Interop.Outlook.TimeZone value that corresponds
        ///    to the time zone for the start time of the appointment. Read/write.
        /// <\summary>
        public virtual Microsoft.Office.Interop.Outlook.TimeZone StartTimeZone { get; set; }

        /// <summary>
        ///    Returns or sets a DateTime value that represents the start date and time
        ///    of the appointment expressed in the Coordinated Univeral Time (UTC) standard.
        ///    Read/write.
        /// <\summary>
        public virtual DateTime StartUTC { get; set; }

        /// <summary>
        ///    Removes the recurrence settings and restores the single-occurrence state
        ///    for an appointment or task.
        /// <\summary>
        public virtual void ClearRecurrencePattern() { }

        /// <summary>
        ///    Closes and optionally saves changes to the Outlook item.
        ///    Copies the Microsoft.Office.Interop.Outlook.AppointmentItem to the folder
        ///    that is specified by the DestinationFolder parameter and returns an object
        ///    that represents the item created in the destination folder by the copy operation.
        ///Parameters:
        ///  DestinationFolder:
        ///    Specifies the folder to which the AppointmentItem object is copied.
        ///  CopyOptions:
        ///    Specifies the user experience of the copy operation.
        ///Returns:
        ///    Returns an AppointmentItem objectthat represents the object created in the
        ///    destination folder as a result of the copy operation.
        /// <\summary>
        public virtual AppointmentItem CopyTo(MAPIFolder DestinationFolder, OlAppointmentCopyOptions CopyOptions) { return null; }

        /// <summary>
        ///    Forwards the Microsoft.Office.Interop.Outlook.AppointmentItem as a vCal;
        ///    virtual calendar item.
        ///Returns:
        ///    A Microsoft.Office.Interop.Outlook.MailItem object that represents the new
        ///    mail item to which the calendar information is attached.
        /// <\summary>
        public virtual MailItem ForwardAsVcal() { return null; }

        /// <summary>
        ///    Obtains the Microsoft.Office.Interop.Outlook.AddressEntry object that contains
        ///    information from the Address Book about the organizer of the Microsoft.Office.Interop.Outlook.AppointmentItem.
        ///Returns:
        ///    Returns an AddressEntry object that represents the organizer of the AppointmentItem.
        /// <\summary>
        public virtual AddressEntry GetOrganizer() { return null; }

        /// <summary>
        ///    Returns a Microsoft.Office.Interop.Outlook.RecurrencePattern object that
        ///    represents the recurrence attributes of an appointment.
        ///Returns:
        ///    A RecurrencePattern object that represents the recurrence attributes of an
        ///    appointment.
        /// <\summary>
        public virtual RecurrencePattern GetRecurrencePattern() { return null; }

        /// <summary>
        ///    Responds to a meeting request.
        ///Parameters:
        ///  Response:
        ///    The response to the request.
        ///  fNoUI:
        ///    True to not display a dialog box; the response is sent automatically. False
        ///    to display the dialog box for responding.
        ///  fAdditionalTextDialog:
        ///    False to not prompt the user for input; the response is displayed in the
        ///    inspector for editing. True to prompt the user to either send or send with
        ///    comments. This argument is valid only if fNoUI is False.
        ///Returns:
        ///    A Microsoft.Office.Interop.Outlook.MeetingItem object that represents the
        ///    response to the meeting request.
        /// <\summary>
        public virtual MeetingItem Respond(OlMeetingResponse Response, object fNoUI = null, object fAdditionalTextDialog = null) { return null; }

        #endregion

        #region Specific to Task

        /// <summary>
        ///     Returns or sets an Integer (int in C#) value indicating the actual effort
        ///     spent on the task. Read/write.
        /// <\summary>
        public virtual int ActualWork { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the text of the card
        ///     data for the task. Read/write.
        /// <\summary>
        public virtual string CardData { get; set; }

        /// <summary>
        ///     Returns a Boolean (bool in C#) that is True if the task is completed. Read/write.
        /// <\summary>
        public virtual bool Complete { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the contact names associated
        ///     with the Outlook item. Read/write.
        /// <\summary>
        public virtual string ContactNames { get; set; }

        /// <summary>
        ///     This object, member, or enumeration is deprecated and is not intended to
        ///     be used in your code.
        /// <\summary>
        public virtual string Contacts { get; set; }

        /// <summary>
        ///     Returns or sets a DateTime indicating the completion date of the task. Read/write.
        /// <\summary>
        public virtual DateTime DateCompleted { get; set; }

        /// <summary>
        ///     Returns an Microsoft.Office.Interop.Outlook.OlTaskDelegationState constant
        ///     indicating the delegation state of the task. Read-only.
        /// <\summary>
        public virtual OlTaskDelegationState DelegationState { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the display name of the delegator
        ///     for the task. Read-only.
        /// </summary>
        public virtual string Delegator { get; private set; }

        /// <summary>
        ///     Returns or sets a DateTime indicating the due date for the task. Read/write.
        /// <\summary>
        public virtual DateTime DueDate { get; set; }

        /// <summary>
        ///     Returns or sets an Integer (int in C#) value specifying the position in the
        ///     view (ordinal) for the task. Read/write.
        /// <\summary>
        public virtual int Ordinal { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) indicating the owner for the task.
        /// <\summary>
        public virtual string Owner { get; set; }

        /// <summary>
        ///     Returns an Microsoft.Office.Interop.Outlook.OlTaskOwnership specifying the
        ///     ownership state of the task. Read-only.
        /// <\summary>
        public virtual OlTaskOwnership Ownership { get; private set; }

        /// <summary>
        ///     Returns or sets an Integer (int in C#) value indicating the percentage of
        ///     the task completed at the current date and time. Read/write.
        /// <\summary>
        public virtual int PercentComplete { get; set; }

        /// <summary>
        ///     Returns an Microsoft.Office.Interop.Outlook.OlTaskResponse constant indicating
        ///     the overall status of the response to the specified task request. Read-only.
        /// <\summary>
        public virtual OlTaskResponse ResponseState { get; private set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) containing the free-form text string
        ///     associating the owner of a task with a role for the task. Read/write.
        /// <\summary>
        public virtual string Role { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the Microsoft Schedule+
        ///     priority for the task. Read/write.
        /// <\summary>
        public virtual string SchedulePlusPriority { get; set; }

        /// <summary>
        ///     Returns or sets a DateTime indicating the start date for the task. Read/write.
        /// <\summary>
        public virtual DateTime StartDate { get; set; }

        /// <summary>
        ///     Returns or sets an Microsoft.Office.Interop.Outlook.OlTaskStatus constant
        ///     specifying the status for the task. Corresponds to the Status field of a
        ///     Microsoft.Office.Interop.Outlook.TaskItem. Read/write.
        /// <\summary>
        public virtual OlTaskStatus Status { get; set; }

        /// <summary>
        ///     Returns or sets a semicolon-delimited String (string in C#) of display names
        ///     for recipients who will receive status upon completion of the task. Read/write.
        /// <\summary>
        public virtual string StatusOnCompletionRecipients { get; set; }

        /// <summary>
        ///     Returns a semicolon-delimited String (string in C#) of display names for
        ///     recipients who receive status updates for the task. Read/write.
        /// <\summary>
        public virtual string StatusUpdateRecipients { get; set; }

        /// <summary>
        ///     Returns a Boolean (bool in C#) that indicates True if the task is a team
        ///     task. Read/write.
        /// <\summary>
        public virtual bool TeamTask { get; set; }

        /// <summary>
        ///     Returns or sets an Integer (int in C#) value indicating the total work for
        ///     the task. Read/write.
        /// <\summary>
        public virtual int TotalWork { get; set; }

        /// <summary>
        ///     Assigns a task and returns a Microsoft.Office.Interop.Outlook.TaskItem object
        ///     that represents it.
        /// Returns:
        ///     A TaskItem object that represents the task.
        /// <\summary>
        public virtual TaskItem Assign() { return null; }

        /// <summary>
        ///     Resets an unsent response to a task request back to a simple task.
        /// <\summary>
        public virtual void CancelResponseState() { }

        /// <summary>
        ///     Marks the task as completed.
        /// <\summary>
        public virtual void MarkComplete() { }

        /// <summary>
        ///     Responds to a task request.
        /// Parameters:
        ///   Response:
        ///     The response to the request.
        ///   fNoUI:
        ///     True to not display a dialog box; the response is sent automatically. False
        ///     to display the dialog box for responding.
        ///   fAdditionalTextDialog:
        ///     False to not prompt the user for input; the response is displayed in the
        ///     inspector for editing. True to prompt the user to either send or send with
        ///     comments. This argument is valid only if fNoUI is False.
        /// Returns:
        ///     A Microsoft.Office.Interop.Outlook.TaskItem that represents the response
        ///     to the task request.
        /// <\summary>
        public virtual TaskItem Respond(OlTaskResponse Response, object fNoUI, object fAdditionalTextDialog) { return null; }

        /// <summary>
        ///     Clears the current instance of a recurring task and sets the recurrence to
        ///     the next instance of that task.
        /// Returns:
        ///     False indicates that the task was the last task in the recurrence, so there
        ///     is no task to set the recurrence to. True indicates that the recurrence was
        ///     successfully set to the next instance of that task.
        /// <\summary>
        public virtual bool SkipRecurrence() { return false; }

        /// <summary>
        ///     Sends a status report to all Cc recipients (recipients returned by the Microsoft.Office.Interop.Outlook._TaskItem.StatusUpdateRecipients
        ///     property) with the current status for the task and returns an Object representing
        ///     the status report.
        /// Returns:
        ///     An Object value that represents the status report.
        /// <\summary>
        public virtual dynamic StatusReport() { return null; }

        #endregion

        #region specific to document
        // No methos/property specific to document
        #endregion

        #region specfic to Post
        /// <summary>
        ///     Sends (posts) the Microsoft.Office.Interop.Outlook.PostItem object.
        /// </summary>
        public virtual void Post() { }

        /// <summary>
        ///     This object, member, or enumeration is deprecated and is not intended to
        ///     be used in your code.
        /// </summary>
        public virtual bool SetACLs() { return false; }

        #endregion

        #region specific to Contact

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the account for the
        ///     contact. Read/write.
        /// </summary>
        public virtual string Account { get; set; }

        /// <summary>
        ///     Returns or sets a DateTime indicating the anniversary date for the contact.
        ///     Read/write.
        /// </summary>
        public virtual DateTime Anniversary { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the name of the person
        ///     who is the assistant for the contact. Read/write.
        /// </summary>
        public virtual string AssistantName { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the telephone number
        ///     of the person who is the assistant for the contact. Read/write.
        /// </summary>
        public virtual string AssistantTelephoneNumber { get; set; }

        /// <summary>
        ///     Returns or sets a DateTime indicating the birthday for the contact. Read/write.
        /// </summary>
        public virtual DateTime Birthday { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the second business
        ///     telephone number for the contact. Read/write.
        /// </summary>
        public virtual string Business2TelephoneNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the whole, unparsed
        ///     business address for the contact. Read/write.
        /// </summary>
        public virtual string BusinessAddress { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the city name portion
        ///     of the business address for the contact. Read/write.
        /// </summary>
        public virtual string BusinessAddressCity { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the country/region code
        ///     portion of the business address for the contact. Read/write.
        /// </summary>
        public virtual string BusinessAddressCountry { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the postal code (zip
        ///     code) portion of the business address for the contact. Read/write.
        /// </summary>
        public virtual string BusinessAddressPostalCode { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the post office box
        ///     number portion of the business address for the contact. Read/write.
        /// </summary>
        public virtual string BusinessAddressPostOfficeBox { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the state code portion
        ///     of the business address for the contact. Read/write.
        /// </summary>
        public virtual string BusinessAddressState { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the street address portion
        ///     of the business address for the contact. Read/write.
        /// </summary>
        public virtual string BusinessAddressStreet { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) that represents the XML markup for
        ///     the layout of the Electronic Business Card. Read/write.
        /// </summary>
        public virtual string BusinessCardLayoutXml { get; set; }

        /// <summary>
        ///     Returns an Microsoft.Office.Interop.Outlook.OlBusinessCardType constant that
        ///     specifies the type of Electronic Business Card used by this contact. Read-only.
        /// </summary>
        public virtual OlBusinessCardType BusinessCardType { get; private set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the business fax number
        ///     for the contact. Read/write.
        /// </summary>
        public virtual string BusinessFaxNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the URL of the business
        ///     Web page for the contact. Read/write.
        /// </summary>
        public virtual string BusinessHomePage { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the first business telephone
        ///     number for the contact. Read/write.
        /// </summary>
        public virtual string BusinessTelephoneNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the callback telephone
        ///     number for the contact. Read/write.
        /// </summary>
        public virtual string CallbackTelephoneNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the car telephone number
        ///     for the contact. Read/write.
        /// </summary>
        public virtual string CarTelephoneNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the names of the children
        ///     of the contact. Read/write.
        /// </summary>
        public virtual string Children { get; set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the concatenated company name
        ///     and full name for the contact. Read-only.
        /// </summary>
        public virtual string CompanyAndFullName { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the company name for the contact
        ///     followed by the concatenated last name, first name, and middle name with
        ///     no space between the last and first names. Read-only.
        /// </summary>
        public virtual string CompanyLastFirstNoSpace { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the company name for the contact
        ///     followed by the concatenated last name, first name, and middle name with
        ///     spaces between the last, first, and middle names. Read-only.
        /// </summary>
        public virtual string CompanyLastFirstSpaceOnly { get; private set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the company main telephone
        ///     number for the contact. Read/write.
        /// </summary>
        public virtual string CompanyMainTelephoneNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the company name for
        ///     the contact. Read/write.
        /// </summary>
        public virtual string CompanyName { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the name of the computer
        ///     network for the contact. Read/write.
        /// </summary>
        public virtual string ComputerNetworkName { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the customer ID for
        ///     the contact. Read/write.
        /// </summary>
        public virtual string CustomerID { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the department name
        ///     for the contact. Read/write.
        /// </summary>
        public virtual string Department { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the e-mail address of
        ///     the first e-mail entry for the contact. Read/write.
        /// </summary>
        public virtual string Email1Address { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the address type (such
        ///     as EX or SMTP) of the first e-mail entry for the contact. Read/write.
        /// </summary>
        public virtual string Email1AddressType { get; set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the display name of the first
        ///     e-mail address for the contact. Read/write.
        /// </summary>
        public virtual string Email1DisplayName { get; set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the Entry ID of the first e-mail
        ///     address for the contact. Read-only.
        /// </summary>
        public virtual string Email1EntryID { get; private set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the e-mail address of
        ///     the second e-mail entry for the contact. Read/write.
        /// </summary>
        public virtual string Email2Address { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the address type (such
        ///     as EX or SMTP) of the second e-mail entry for the contact. Read/write.
        /// </summary>
        public virtual string Email2AddressType { get; set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the display name of the second
        ///     e-mail entry for the contact. Read/write.
        /// </summary>
        public virtual string Email2DisplayName { get; set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the Entry ID of the second e-mail
        ///     entry for the contact. Read-only.
        /// </summary>
        public virtual string Email2EntryID { get; private set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the e-mail address of
        ///     the third e-mail entry for the contact. Read/write.
        /// </summary>
        public virtual string Email3Address { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the address type (such
        ///     as EX or SMTP) of the third e-mail entry for the contact. Read/write.
        /// </summary>
        public virtual string Email3AddressType { get; set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the display name of the third
        ///     e-mail entry for the contact. Read/write.
        /// </summary>
        public virtual string Email3DisplayName { get; set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the entry ID of the third e-mail
        ///     entry for the contact. Read-only.
        /// </summary>
        public virtual string Email3EntryID { get; private set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) indicating the default keyword string
        ///     assigned to the contact when it is filed. Read/write.
        /// </summary>
        public virtual string FileAs { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the first name for the
        ///     contact. Read/write.
        /// </summary>
        public virtual string FirstName { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the FTP site entry for
        ///     the contact. Read/write.
        /// </summary>
        public virtual string FTPSite { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) specifying the whole, unparsed full
        ///     name for the contact. Read/write.
        /// </summary>
        public virtual string FullName { get; set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the full name and company of
        ///     the contact by concatenating the values of the Microsoft.Office.Interop.Outlook._ContactItem.FullName
        ///     and Microsoft.Office.Interop.Outlook._ContactItem.CompanyName properties.
        ///     Read-only.
        /// </summary>
        public virtual string FullNameAndCompany { get; private set; }

        /// <summary>
        ///     Returns or sets an Microsoft.Office.Interop.Outlook.OlGender constant indicating
        ///     the gender of the contact. Read/write.
        /// </summary>
        public virtual OlGender Gender { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the government ID number
        ///     for the contact. Read/write.
        /// </summary>
        public virtual string GovernmentIDNumber { get; set; }

        /// <summary>
        ///     Returns a Boolean (bool in C#) value that is True if a Contacts item has
        ///     a picture associated with it. Read-only
        /// </summary>
        public virtual bool HasPicture { get; private set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the hobby for the contact.
        ///     Read/write.
        /// </summary>
        public virtual string Hobby { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the second home telephone
        ///     number for the contact. Read/write.
        /// </summary>
        public virtual string Home2TelephoneNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the full, unparsed text
        ///     of the home address for the contact. Read/write.
        /// </summary>
        public virtual string HomeAddress { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the city portion of
        ///     the home address for the contact. Read/write.
        /// </summary>
        public virtual string HomeAddressCity { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the country/region portion
        ///     of the home address for the contact. Read/write.
        /// </summary>
        public virtual string HomeAddressCountry { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the postal code portion
        ///     of the home address for the contact. Read/write.
        /// </summary>
        public virtual string HomeAddressPostalCode { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) the post office box number portion
        ///     of the home address for the contact. Read/write.
        /// </summary>
        public virtual string HomeAddressPostOfficeBox { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the state portion of
        ///     the home address for the contact. Read/write.
        /// </summary>
        public virtual string HomeAddressState { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the street portion of
        ///     the home address for the contact. Read/write.
        /// </summary>
        public virtual string HomeAddressStreet { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the home fax number
        ///     for the contact. Read/write.
        /// </summary>
        public virtual string HomeFaxNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the first home telephone
        ///     number for the contact. Read/write.
        /// </summary>
        public virtual string HomeTelephoneNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) that represents a contact's Microsoft
        ///     Instant Messenger address. Read/write.
        /// </summary>
        public virtual string IMAddress { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the initials for the
        ///     contact. Read/write.
        /// </summary>
        public virtual string Initials { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) corresponding to the Address box
        ///     on the Details tab for a contact. Read/write.
        /// </summary>
        public virtual string InternetFreeBusyAddress { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the ISDN number for
        ///     the contact. Read/write.
        /// </summary>
        public virtual string ISDNNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the job title for the
        ///     contact. Read/write.
        /// </summary>
        public virtual string JobTitle { get; set; }

        /// <summary>
        ///     Returns a Boolean (bool in C#) that indicates True if the transaction of
        ///     the contact will be journalized. Read/write.
        /// </summary>
        public virtual bool Journal { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) that represents the language in which
        ///     the contact writes messages. Read/write.
        /// </summary>
        public virtual string Language { get; set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the last name, first name, middle
        ///     name, and suffix of the contact. Read-only.
        /// </summary>
        public virtual string LastFirstAndSuffix { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the concatenated last name,
        ///     first name, and middle name of the contact with no space between the last
        ///     name and the first name. Read-only.
        /// </summary>
        public virtual string LastFirstNoSpace { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) that contains the last name, first name,
        ///     and suffix of the user without a space. Read-only
        /// </summary>
        public virtual string LastFirstNoSpaceAndSuffix { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the concatenated last name,
        ///     first name, and middle name of the contact with no space between the last
        ///     name and the first name. Read-only.
        /// </summary>
        public virtual string LastFirstNoSpaceCompany { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the concatenated last name,
        ///     first name, and middle name of the contact with spaces between them. Read-only.
        /// </summary>
        public virtual string LastFirstSpaceOnly { get; private set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the concatenated last name,
        ///     first name, and middle name of the contact with spaces between them. Read-only.
        /// </summary>
        public virtual string LastFirstSpaceOnlyCompany { get; private set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the last name for the
        ///     contact. Read/write.
        /// </summary>
        public virtual string LastName { get; set; }

        /// <summary>
        ///     Returns a String (string in C#) representing the concatenated last name and
        ///     first name for the contact. Read-only.
        /// </summary>
        public virtual string LastNameAndFirstName { get; private set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the full, unparsed selected
        ///     mailing address for the contact. Read/write.
        /// </summary>
        public virtual string MailingAddress { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the city name portion
        ///     of the selected mailing address of the contact. Read/write.
        /// </summary>
        public virtual string MailingAddressCity { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the country/region code
        ///     portion of the selected mailing address of the contact. Read/write.
        /// </summary>
        public virtual string MailingAddressCountry { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the postal code (zip
        ///     code) portion of the selected mailing address of the contact. Read/write.
        /// </summary>
        public virtual string MailingAddressPostalCode { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the post office box
        ///     number portion of the selected mailing address of the contact. Read/write.
        /// </summary>
        public virtual string MailingAddressPostOfficeBox { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the state code portion
        ///     for the selected mailing address of the contact. Read/write.
        /// </summary>
        public virtual string MailingAddressState { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the street address portion
        ///     of the selected mailing address of the contact. Read/write.
        /// </summary>
        public virtual string MailingAddressStreet { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the manager name for
        ///     the contact. Read/write.
        /// </summary>
        public virtual string ManagerName { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the middle name for
        ///     the contact. Read/write.
        /// </summary>
        public virtual string MiddleName { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the mobile telephone
        ///     number for the contact. Read/write.
        /// </summary>
        public virtual string MobileTelephoneNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) indicating the user's Microsoft NetMeeting
        ///     ID, or alias. Read/write.
        /// </summary>
        public virtual string NetMeetingAlias { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the nickname for the
        ///     contact. Read/write.
        /// </summary>
        public virtual string NickName { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) specifying the specific office location
        ///     (for example, Building 1 Room 1 or Suite 123) for the contact. Read/write.
        /// </summary>
        public virtual string OfficeLocation { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the organizational ID
        ///     number for the contact. Read/write.
        /// </summary>
        public virtual string OrganizationalIDNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the other address for
        ///     the contact. Read/write.
        /// </summary>
        public virtual string OtherAddress { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the city portion of
        ///     the other address for the contact. Read/write.
        /// </summary>
        public virtual string OtherAddressCity { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the country/region portion
        ///     of the other address for the contact. Read/write.
        /// </summary>
        public virtual string OtherAddressCountry { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the postal code portion
        ///     of the other address for the contact. Read/write.
        /// </summary>
        public virtual string OtherAddressPostalCode { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the post office box
        ///     portion of the other address for the contact. Read/write.
        /// </summary>
        public virtual string OtherAddressPostOfficeBox { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the state portion of
        ///     the other address for the contact. Read/write.
        /// </summary>
        public virtual string OtherAddressState { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the street portion of
        ///     the other address for the contact. Read/write.
        /// </summary>
        public virtual string OtherAddressStreet { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the other fax number
        ///     for the contact. Read/write.
        /// </summary>
        public virtual string OtherFaxNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the other telephone
        ///     number for the contact. Read/write.
        /// </summary>
        public virtual string OtherTelephoneNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the pager number for
        ///     the contact. Read/write.
        /// </summary>
        public virtual string PagerNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) representing the URL of the personal
        ///     Web page for the contact. Read/write.
        /// </summary>
        public virtual string PersonalHomePage { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) specifying the primary telephone
        ///     number for the contact. Read/write.
        /// </summary>
        public virtual string PrimaryTelephoneNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) indicating the profession for the
        ///     contact. Read/write.
        /// </summary>
        public virtual string Profession { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) indicating the radio telephone number
        ///     for the contact. Read/write.
        /// </summary>
        public virtual string RadioTelephoneNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) specifying the referral name entry
        ///     for the contact. Read/write.
        /// </summary>
        public virtual string ReferredBy { get; set; }

        /// <summary>
        ///     Returns or sets an Microsoft.Office.Interop.Outlook.OlMailingAddress constant
        ///     indicating the type of the mailing address for the contact. Read/write.
        /// </summary>
        public virtual OlMailingAddress SelectedMailingAddress { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) indicating the spouse name entry
        ///     for the contact. Read/write.
        /// </summary>
        public virtual string Spouse { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) indicating the name suffix (such
        ///     as Jr., III, or Ph.D.) for the specified contact. Read/write.
        /// </summary>
        /// 
        public virtual string Suffix { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) indicating the telex number for the
        ///     contact. Read/write.
        /// </summary>
        public virtual string TelexNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) indicating the title for the contact.
        ///     Read/write.
        /// </summary>
        public virtual string Title { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) specifying the TTY/TDD telephone
        ///     number for the contact. Read/write.
        /// </summary>
        public virtual string TTYTDDTelephoneNumber { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) specifying the first field on the
        ///     Contacts form intended for miscellaneous use for the contact. Read/write.
        /// </summary>
        public virtual string User1 { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) specifying the second field on the
        ///     Contacts form intended for miscellaneous use for the contact. Read/write.
        /// </summary>
        public virtual string User2 { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) specifying the third field on the
        ///     Contacts form intended for miscellaneous use for the contact. Read/write.
        /// </summary>
        public virtual string User3 { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) specifying the fourth field on the
        ///     Contacts form intended for miscellaneous use for the contact. Read/write.
        /// </summary>
        public virtual string User4 { get; set; }

        /// <summary>
        ///     This object, member, or enumeration is deprecated and is not intended to
        ///     be used in your code.
        /// </summary>
        public virtual string UserCertificate { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) indicating the URL of the Web page
        ///     for the contact. Read/write.
        /// </summary>
        public virtual string WebPage { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) indicating the Japanese phonetic
        ///     rendering (yomigana) of the company name for the contact. Read/write.
        /// </summary>
        public virtual string YomiCompanyName { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) indicating the Japanese phonetic
        ///     rendering (yomigana) of the first name for the contact. Read/write.
        /// </summary>
        public virtual string YomiFirstName { get; set; }

        /// <summary>
        ///     Returns or sets a String (string in C#) indicating the Japanese phonetic
        ///     rendering (yomigana) of the last name for the contact. Read/write.
        /// </summary>
        public virtual string YomiLastName { get; set; }

        /// <summary>
        ///     Adds a logo picture to the current Electronic Business Card of the contact
        ///     item.
        /// Parameters:
        ///   Path:
        ///     The full path name that specifies the picture file to load.
        /// </summary>
        public virtual void AddBusinessCardLogoPicture(string Path) { }

        /// <summary>
        ///     Adds a picture to a contact item.
        /// Parameters:
        ///   Path:
        ///     A string containing the complete path and filename of the picture to be added
        ///     to the contact item.
        /// </summary>
        public virtual void AddPicture(string Path) { }

        /// <summary>
        ///     Creates a new Microsoft.Office.Interop.Outlook.MailItem object containing
        ///     contact information and, optionally, an Electronic Business Card (EBC) image
        ///     based on the specified Microsoft.Office.Interop.Outlook.ContactItem object.
        /// Returns:
        ///     A MailItem object that represents the new e-mail item containing the business
        ///     card information.
        /// </summary>
        public virtual MailItem ForwardAsBusinessCard() { return null; }

        /// <summary>
        ///     Creates a Microsoft.Office.Interop.Outlook.MailItem and attaches the contact
        ///     information in vCard format.
        /// Returns:
        ///     A MailItem object that represents the new mail item to which the contact
        ///     information is attached.
        /// </summary>
        public virtual MailItem ForwardAsVcard() { return null; }

        /// <summary>
        ///     Removes a picture from a Contacts item.
        /// </summary>
        public virtual void RemovePicture() { }

        /// <summary>
        ///     Resets the Electronic Business Card on the contact item to the default business
        ///     card, deleting any custom layout and logo on the Electronic Business Card.
        /// </summary>
        public virtual void ResetBusinessCard() { }

        /// <summary>
        ///     Saves an image of the business card generated from the specified Microsoft.Office.Interop.Outlook.ContactItem
        ///     object.
        /// Parameters:
        ///   Path:
        ///     The fully qualified path and file name of the image to be saved.
        /// </summary>
        public virtual void SaveBusinessCardImage(string Path) { }

        /// <summary>
        ///     Displays the electronic business card (EBC) editor dialog box for the Microsoft.Office.Interop.Outlook.ContactItem
        ///     object.
        /// </summary>
        public virtual void ShowBusinessCardEditor() { }

        /// <summary>
        ///     Displays the Check Phone Number dialog box for a specified telephone number
        ///     contained by a Microsoft.Office.Interop.Outlook.ContactItem object.
        /// Parameters:
        ///   PhoneNumber:
        ///     The type of telephone number to be checked.
        /// </summary>
        public virtual void ShowCheckPhoneDialog(OlContactPhoneNumber PhoneNumber) { }
        #endregion

        /// <summary>
        /// Disposes managed & unmanaged resources
        /// </summary> 
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        /// <summary>
        /// Disposes managed & unmanaged resources
        /// This can be overrwitten in derived class
        /// </summary>
        /// <param name="disposing"></param>
        protected virtual void Dispose(bool disposing)
        {
            if (!isDisposed)
            {
                if (disposing)
                {
                    // Dispose managed resources
                }

                // Dispose un-managed resources


                isDisposed = true;
            }
        }

        /// <summary>
        /// Finalizer
        /// </summary>
        ~OutlookMessageItemWrapper()
        {
            Dispose(false);
        }
    }
}
